Problem
巡游
Description
国正在准备每年一次的巡游活动。国王将会在一个城市里召集人群,沿着城市间的道路进行游览,最终在一个城市里发表他每年一次的著名演讲。
国有个城市,由于国家的特殊要求,每两个城市之间存在一条唯一的简单通路。国王希望借着这个机会视察国的城市建设,因此他提出到的距离不能少于条道路。
同时,国王的私人医生检查了他的身体情况后,断定国王的身体不适合做长途旅行,因此他要求到的距离不能多于条道路。
另外,政府希望跟随国王的人民沿途不仅能看到城市风景,还能看到城市外的美丽乡村。因此每条道路定义了一个魅力值,一条路径的魅力值定义为这条路径的中位数。更详细的说法是这样的:将路径上所有边的魅力值排序,得到序列。假设,中位数就是。
你的任务就是求出魅力值最大的路径,并输出这个魅力值。
Input
第一行是三个整数,表示国的城市个数、路径的最小和最大长度。
接下来行,每行个整数,表示有一条连接和且魅力值的道路。
Output
Sample Input
1 | 5 1 4 |
Sample Output
1 | 7 |
HINT
对于的数据:,,。
标签:点分治
二分答案
单调队列
Solution
稍有码量的点分题。
首先策略是,二分答案魅力值,将所有的边权变为和,分别表示大于等于魅力值和小于魅力值。这样验证问题转化为判断是否有一条长度在间路径使得边权和大于等于。
这个判断过程可以用点分治实现。对于每个分治中心,只考虑经过其的路径。在其点分树的不同子树中找两个点,使得其到分治中心的路径长度和在之间,可以用两个桶,分别存已枚举的子树和当前子树中各个深度的最大路径边权和,需要用单调队列维护一下。这部分有些细节需要注意。
此题卡常,注意一些减小常数的细节:
- 二分答案时,将原边权记下来排序,在排好的数组上二分,这样只会二分到边权值
- 一开始将点分树记下来,记录所有分治中心,这样每次二分可以不用重新找重心
- 点分时在当前分治中心统计答案时用
- 预处理点分时在当前分治中心,若下一个点的距离大于则退出
Code
1 |
|